package com.candoit.webapps.pricing.controllers;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.myfaces.custom.fileupload.UploadedFile;

import com.candoit.webapps.pricing.model.Categoria;
import com.candoit.webapps.pricing.model.CentroCostos;
import com.candoit.webapps.pricing.model.Cuenta;
import com.candoit.webapps.pricing.model.CuentaMes;
import com.candoit.webapps.pricing.util.CuentaMesUtil;
import com.candoit.webapps.pricing.util.CuentaUtil;
import com.candoit.webapps.pricing.util.ImportExcelUtil;
import com.candoit.webapps.pricing.util.QueryUtil;

@ManagedBean(name = "cuentasCtrl")
@ViewScoped
public class CuentasController extends AbstractController {
	
	private List<CuentaUtil> cuentas;
	
	private List<CuentaMesUtil> cuentaMes;
	
	private List<CuentaMesUtil> cuentaMesMO;
	
	private UploadedFile archivo;
	
	private List<CentroCostos> ccppds;

	public List<CuentaUtil> getCuentas() {
		List<Cuenta> list = QueryUtil.getInstance().getCuentas();
		cuentas = new ArrayList<CuentaUtil>();
		for (Cuenta cuenta : list){
			CuentaUtil util = new CuentaUtil();
			util.setCuenta(cuenta);
			util.setSelected(false);
			cuentas.add(util);
		}
		Cuenta cuentaNew = new Cuenta();
		CuentaUtil utilNew = new CuentaUtil();
		utilNew.setCuenta(cuentaNew);
		utilNew.setSelected(false);
		cuentas.add(utilNew);
		return cuentas;
	}


	public List<CentroCostos> getCCPPDs(){
		ccppds = QueryUtil.getInstance().getCentroCostosByCategoria(Categoria.SERVICES_CODE);
		return ccppds;
	}
	
	
	public void setCuentas(List<CuentaUtil> cuentas) {
		this.cuentas = cuentas;
	}
	
	public void saveCuentas(){
		Iterator<CuentaUtil> it = cuentas.iterator();
		while (it.hasNext()){
			CuentaUtil cuenta = (CuentaUtil) it.next();
			if (cuenta.getCuenta().getId() != null){
				this.update(cuenta.getCuenta());
			}else{
				if (!cuenta.getCuenta().getDescripcion().equals("")){
					this.save(cuenta.getCuenta());
				}
			}
		}
		
		for (CentroCostos cc : ccppds){
			this.update(cc);
		}
	}
	
	public void borrarCuentas(){
		Iterator<CuentaUtil> it = cuentas.iterator();
		while (it.hasNext()){
			CuentaUtil cuenta = (CuentaUtil) it.next();
			if (cuenta.isSelected() && cuenta.getCuenta().getId() != null){
				List<CuentaMes> list = QueryUtil.getInstance().getCuentasMesByCuenta(cuenta.getCuenta());
				for (CuentaMes cuentaMes : list){
					 this.remove(cuentaMes);
				}
				this.remove(cuenta.getCuenta());
			}
		 }
	}

	public List<CuentaMesUtil> getCuentaMes() {
		if (cuentaMes == null){
			cuentaMes = new ArrayList<CuentaMesUtil>();			
			List<CuentaMes> list = QueryUtil.getInstance().getCuentasByMesExceptsMO();
			for (CuentaMes c : list){
				 CuentaMesUtil util = new CuentaMesUtil();
				 util.setCuenta(c);
				 util.setChanged(false);
				 util.setDescripcion(c.getCuentaMesFK().getCuenta().getDescripcion());
				 util.setCostoSimulado(c.getCostoSimulado());
				 util.setCostoActual(c.getCosto());
				 util.setCentro(c.getCuentaMesFK().getCuenta().getCentro());
				 util.setCategoria(c.getCuentaMesFK().getCuenta().getCategoria());
				 cuentaMes.add(util);
			}
		}	
		
		return cuentaMes;
	}
	
	/*TODO: llevar a libreria o usar otro metodo*/
//	private Integer mesActual(){
//		Calendar cal = new GregorianCalendar();
//		Date fechaActual = new Date();
//		cal.setTime(fechaActual);
//		Integer mesActual = cal.get(Calendar.MONTH);
//		List<CuentaMes> cuentas = QueryUtil.getInstance().getCuentasByMes(mesActual);
//        if (cuentas == null || cuentas.isEmpty()){
//                if (mesActual != 0){
//                        mesActual = mesActual -1;
//                }else{
//                        mesActual = 11;
//                }
//        }
//		return mesActual;
//	}

	public void setCuentaMes(List<CuentaMesUtil> cuentaMes) {
		this.cuentaMes = cuentaMes;
	}
	
	public void simular(List<CuentaMesUtil> list, boolean isCuentaMes){
		Iterator<CuentaMesUtil> it = list.iterator();
		while (it.hasNext()){
			CuentaMesUtil cuenta = (CuentaMesUtil) it.next();
			 double costoSimulado = cuenta.getCostoSimulado();
			 String val = costoSimulado+"";
			 BigDecimal big = new BigDecimal(val);
			 big = big.setScale(4, RoundingMode.HALF_UP);
			 double costoActual = cuenta.getCostoActual();
			 String valXls = costoActual+"";
			 BigDecimal bigXls = new BigDecimal(valXls);
			 bigXls = bigXls.setScale(4, RoundingMode.HALF_UP);
			if (big.compareTo(bigXls) != 0){
			    cuenta.getCuenta().setCosto(costoSimulado);
			    cuenta.getCuenta().setCostoSimulado(costoSimulado);
			    cuenta.setChanged(true);
			    this.update(cuenta.getCuenta());
			}
		}
		
		String page = "";
		if (isCuentaMes){
			page = "admin-cuentas-mes.jsf";
		}else{
			page = "admin-salarios.jsf";
		}
		
		FacesContext.getCurrentInstance().renderResponse();
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect(page);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	public void saveCuentasMes(List<CuentaMesUtil> list, boolean isCuentaMes){
		Iterator<CuentaMesUtil> it = list.iterator();
		while(it.hasNext()){
			CuentaMesUtil util = (CuentaMesUtil)it.next();
			util.getCuenta().setCostoSimulado(util.getCostoSimulado());
			util.getCuenta().setCosto(util.getCostoActual());
			this.update(util.getCuenta());
			util.getCuenta().getCuentaMesFK().getCuenta().setCentro(util.getCentro());
			util.getCuenta().getCuentaMesFK().getCuenta().setDescripcion(util.getDescripcion());
			util.getCuenta().getCuentaMesFK().getCuenta().setCategoria(util.getCategoria());
			this.update(util.getCuenta().getCuentaMesFK().getCuenta());
		}
		
		String page = "";
		if (isCuentaMes){
			page = "admin-cuentas-mes.jsf";
		}else{
			page = "admin-salarios.jsf";
		}
		
		FacesContext.getCurrentInstance().renderResponse();
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect(page);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	public void borrarCuentasSeleccionados(List<CuentaMesUtil> list, boolean isCuentaMes){
		Iterator<CuentaMesUtil> it = list.iterator();
		while(it.hasNext()){
			CuentaMesUtil util = (CuentaMesUtil)it.next();
			if (util.isSelected()){
				this.remove(util.getCuenta());
			}
		   }
		String page = "";
		if (isCuentaMes){
			page = "admin-cuentas-mes.jsf";
		}else{
			page = "admin-salarios.jsf";
		}
		
		FacesContext.getCurrentInstance().renderResponse();
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect(page);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	public List<CuentaMesUtil> getCuentaMesMO() {
		if (cuentaMesMO == null){
			cuentaMesMO = new ArrayList<CuentaMesUtil>();
			List<CuentaMes> list = QueryUtil.getInstance().getCuentasByMesManoDeObra();
			for (CuentaMes c : list){
				 CuentaMesUtil util = new CuentaMesUtil();
				 util.setCuenta(c);
				 util.setCostoActual(c.getCosto());
				 util.setChanged(false);
				 util.setDescripcion(c.getCuentaMesFK().getCuenta().getDescripcion());
				 util.setCostoSimulado(c.getCostoSimulado());
				 util.setCostoActual(c.getCosto());
				 util.setCentro(c.getCuentaMesFK().getCuenta().getCentro());
				 cuentaMesMO.add(util);
		    }
		}	
		return cuentaMesMO;
	}

	public void setCuentaMesMO(List<CuentaMesUtil> cuentaMesMO) {
		this.cuentaMesMO = cuentaMesMO;
	}
	
	public void saveCuentasMOMes(){
		Iterator<CuentaMesUtil> it = cuentaMesMO.iterator();
		while (it.hasNext()){
			CuentaMesUtil cuenta = (CuentaMesUtil) it.next();
			 double costoSimulado = cuenta.getCostoActual();
			 String val = costoSimulado+"";
			 BigDecimal big = new BigDecimal(val);
			 big = big.setScale(4, RoundingMode.HALF_UP);
			 double costoActual = cuenta.getCuenta().getCosto();
			 String valXls = costoActual+"";
			 BigDecimal bigXls = new BigDecimal(valXls);
			 bigXls = bigXls.setScale(4, RoundingMode.HALF_UP);
			if (big.compareTo(bigXls) != 0){
			    cuenta.getCuenta().setCosto(cuenta.getCostoActual());
			    cuenta.setChanged(true);
			    this.update(cuenta.getCuenta());
			}
		}
	}

	public void importar(){
		if(archivo != null){
			boolean ok = ImportExcelUtil.getInstance().importarCuentas(archivo);
			if (ok){
					try {
						FacesContext.getCurrentInstance().getExternalContext().redirect("admin-cuentas-mes.jsf");
					    } catch (IOException e) {
					    	e.printStackTrace();
					    }
			}else{
				return;
			}
	}
	   	
}

	public UploadedFile getArchivo() {
		return archivo;
	}

	public void setArchivo(UploadedFile archivo) {
		this.archivo = archivo;
	}
	
	public void importarCargasSociales(){
		if(archivo != null){
			boolean ok = ImportExcelUtil.getInstance().importarCuentasManoDeObra(archivo);
			if (ok){
				try {
					FacesContext.getCurrentInstance().getExternalContext().redirect("admin-salarios.jsf");
					} catch (IOException e) {
						e.printStackTrace();
					}
			}else{
				return;
			}
	  }		
		

  }
	
}
